home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / sun4c.md / cpu.map.h < prev    next >
C/C++ Source or Header  |  1990-12-19  |  10KB  |  219 lines

  1. /*
  2.  * cpu.map.h
  3.  *
  4.  * @(#)cpu.map.h 1.5 88/02/08 SMI
  5.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  6.  *
  7.  * Memory Mapping and Paging on the Sun-4
  8.  *
  9.  * This file is used for both stand-alone code (ROM Monitor, Diagnostics,
  10.  * boot programs, etc.) and for the Unix kernel.  IF YOU HAVE TO CHANGE IT
  11.  * to fit your application, MOVE THE CHANGE BACK TO THE PUBLIC COPY, and
  12.  * make sure the change is upward-compatible.  The last thing we need is
  13.  * many different copies of this file.
  14.  *
  15.  * The context register selects among NUMCONTEXTS different address spaces 
  16.  * (contexts).  Each address space typically corresponds to a process and is 
  17.  * 4G-bytes.  Each memory access is translated through the address space 
  18.  * indicated by the context register.
  19.  *
  20.  * The context register occupies a byte in control space, although only
  21.  * the low 4 bits are relevant.  The high-order bits are ignored on writes,
  22.  * and return garbage on reads.  You can mask the upper 4 bits with CONTEXTMASK.
  23.  */
  24.  
  25. #define    NUMCONTEXTS 16
  26. #define    CONTEXTMASK (NUMCONTEXTS-1) /* Relevant bits on read of cx reg */
  27.  
  28. /*
  29.  * The segment map determines which large pieces of the 4G-byte address space
  30.  * are actually in use.  Each chunk of address space is mapped to a set of
  31.  * PGSPERSEG page map entries (pmegs).  Chunks which are not in use should all 
  32.  * be mapped to a single set of page map entries, which should prohibit
  33.  * all accesses.
  34.  *
  35.  * There are SEGSPERCONTEXT segment map entries in each logical context.
  36.  * There are NUMPMEGS total page map entry groups (pmegs) in the physical
  37.  * page map.  Each segment map entry references a pmeg which contains
  38.  * the PGSPERSEG (number of page table entries per pmeg) pages defining 
  39.  * that segment.
  40.  *
  41.  * Note that there is much more virtual address space (4G-bytes) as there
  42.  * is physical space mappable at one time (16384 x 8K ???).  You can't map in 
  43.  * 4G-bytes at once even if you have that much physical memory, since the page 
  44.  * map is the bottleneck here.  The solution is to "page" the page map entries
  45.  * in and out of the physical pmegs on demand.
  46.  */
  47.  
  48. #define    SEGSPERCONTEXT    4096
  49. #define    NUMPMEGS    512
  50. #define    PGSPERSEG    32   /* The number of pmegs associated *
  51.                               * with each segment table entry. */
  52.  
  53. /*
  54.  * The following are valid in the pm_type field of the page map.
  55.  */
  56. enum pm_types {
  57.   VPM_MEMORY=0,        /* Page is in main memory.                     */
  58.   VPM_IO=1,        /* Page is on-board I/O.                       */
  59.   VPM_VME16=2,        /* Page is on VME-bus, accessing 16-bit device.*/
  60.   VPM_VME32=3,        /* Page is on VME-bus, accessing 32-bit device.*/
  61.   VPM_MEMORY_NOCACHE=4,    /* Page is in main memory, but not cacheable.  */
  62.   VPM_IO_NOCACHE=5    /* Page is in on-board I/O, but not cacheable. */
  63. };
  64. /*
  65.  * The following are valid in the pm_permissions field.
  66.  */
  67. enum pm_perm {
  68.   PMP_RO=0,    /* Page is read-only by all (user and supervisor). */
  69.   PMP_RO_SUP=1,    /* Page is read-only by supervisor.                */
  70.   PMP_ALL=2,    /* Page is read-write by all (user and supervisor).*/
  71.   PMP_SUP=3,    /* Page is read-write by supervisor.               */
  72. };
  73. struct pgmapent {
  74.   unsigned    pm_valid    :1;    /* This entry is valid.       */
  75.   enum pm_perm    pm_permissions    :2;    /* Access privileges: write   */
  76.                     /* access? supervisor access? */
  77.   enum pm_types    pm_type        :3;    /* don't cache and page type. */
  78.   unsigned    pm_accessed    :1;    /* Page has been read.        */
  79.   unsigned    pm_modified    :1;    /* Page has been written.     */
  80.   unsigned    pm_reserved    :5;    /* Reserved.                  */
  81.   unsigned    pm_page        :19;    /* Page # in physical memory. */
  82. };
  83.  
  84. /*
  85.  * The page map gives fine-grain control over memory allocation.  Each page
  86.  * map entry controls BYTESPERPG (a page) of memory.  Each page can be mapped
  87.  * to memory, I/O, or a global bus (e.g. VME-bus), or can be inaccessible.
  88.  * Each page can be protected against user access and can be made readable
  89.  * or readable and writable.  If access is denied, the page referenced and 
  90.  * modified bits will not be changed, nor will the page number or type fields 
  91.  * be used; so they can be used by software.
  92.  */
  93. #define    BYTESPERPG    8192
  94. #define    BYTESPERSEG    (BYTESPERPG*PGSPERSEG)
  95. #define    BYTES_PG_SHIFT    13
  96.  
  97. #define    PMREALBITS    0xFF07FFFF /* Which are actually implemented.  Mask *
  98.                                     * out 5 Reserved bits.                  */
  99.  
  100. /*
  101.  * When the page type is PM_IO, the PAGE NUMBER field selects
  102.  * which of the main I/O device chips is being selected.  Low-order (non-
  103.  * mapped) address bits connect to the address lines of the device and
  104.  * determine which facility of the device is being accessed.
  105.  * 
  106.  * Type 1 devices and their corresponding page number.
  107.  */
  108. #define    VIOPG_KBM     0x78000 /* Dual serial Z8530 SCC for keyboard&mouse */
  109. #define    VIOPG_SERIAL0     0x78800 /* Dual serial Z8530 SCC                    */
  110. #define    VIOPG_EEPROM     0x79000 /* Non-volatile memory (EEPROM)             */
  111. #define    VIOPG_CLOCK     0x79800 /* Intersil 7170 time-of-day clock          */
  112. #define    VIOPG_MEMORY_ERR 0x7a000 /* CPU Memory Error registers               */
  113. #define    VIOPG_INTERRUPT     0x7a800 /* Interrupt control register               */
  114. #define    VIOPG_ETHER     0x7b000 /* Intel 82586 Ethernet interface           */
  115. #define    VIOPG_COLORMAP     0x7b800 /* Color Map for onboard video someday      */
  116. #define    VIOPG_PROM     0x7c000 /* Bootstrap proms (EPROM)                  */
  117. #define    VIOPG_AMD_ETHER     0x7c800 /* AMD Ethernet interface                   */
  118. #define VIOPG_SCSI     0x7d000 /* Onboard SCSI interface                   */
  119. /*             0x7d800  * Reserved                                 */
  120. /*             0x7e000  * Reserved                                 */
  121. #define VIOPG_VIDEO      0x7e800 /* video RAM                                */
  122. #define    VIOPG_DES     0x7f000 /* AMD 8068 data ciphering processor        */
  123. #define    VIOPG_ECC_CTRL     0x7f8f0 /* ECC Control Register access              */
  124.  
  125. /*
  126.  * For new "setupmap" routine in file "mapmem.c".
  127.  */
  128. #define VIOPAGE_INVALID    0x70000000   /* Invalid page table entry.          */
  129. #define    VIOPAGE_KBM       0xd4078000   /* Dual serial Z8530 SCC for          *
  130.                                          * keyboard&mouse                     */
  131. #define    VIOPAGE_SERIAL0       0xd4078800   /* Dual serial Z8530 SCC              */
  132. #define    VIOPAGE_EEPROM       0xd4079000   /* Non-volatile memory (EEPROM)       */
  133. #define    VIOPAGE_CLOCK       0xd4079800   /* Intersil 7170 time-of-day clock    */
  134. #define    VIOPAGE_MEMORY_ERR 0xd407a000   /* CPU Memory Error registers         */
  135. #define    VIOPAGE_INTERRUPT  0xd407a800   /* Interrupt control register         */
  136. #define    VIOPAGE_ETHER       0xd407b000   /* Intel 82586 Ethernet interface     */
  137. #define    VIOPAGE_COLORMAP   0xd407b800   /* Color Map for onboard video someday*/
  138. #define    VIOPAGE_PROM       0xd407c000   /* Bootstrap proms (EPROM)            */
  139. #define    VIOPAGE_AMD_ETHER  0xd407c800   /* AMD Ethernet interface             */
  140. #define VIOPAGE_SCSI       0xd407d000   /* Onboard SCSI interface             */
  141. /*               0xd407d800    * Reserved                           */
  142. /*               0xd407e000    * Reserved                           */
  143. #define VIOPAGE_VIDEO      0xd407e800   /* video RAM                          */
  144.  
  145. #ifdef COBRA
  146. #define VIOPAGE_ENA_PLANE  0xd407ea00   /* cobra video enable plane          */
  147. #define VIOPAGE_CFB       0xd407ec00   /* cobra color frame buffer           */
  148. #endif COBRA
  149.  
  150. #define    VIOPAGE_DES       0xd407f000   /* AMD 8068 data ciphering processor  */
  151. #define    VIOPAGE_ECC_CTRL   0xd407f8f0   /* ECC Control Register access        */
  152.  
  153. #ifndef COBRA                /* no VME in cobra            */
  154. /*
  155.  * Other special page numbers.
  156.  */
  157. #define    VMEPG_24ADDR    (0xFF000000 >> BYTES_PG_SHIFT)    /* 24-bit addr VME  */
  158. #define    VMEPG_16ADDR    (0xFFFF0000 >> BYTES_PG_SHIFT)    /* 16-bit addr VME  */
  159. #define VME_COLOR_PHYS 0xFF400000     /* Base addr (not pg#) of VME color */
  160. #define VPM_VME_COLOR    VPM_VME16        /* Page type for VME color          */
  161. #define VMEPG_COLOR    (VME_COLOR_PHYS >> BYTES_PG_SHIFT)
  162. #endif COBRA
  163.  
  164. #ifdef COBRA
  165. #define MONBEG  0xFFB00000        /* 2Mbytes before MONSTART to
  166.                      * accomodate color frame buffer and
  167.                      * enable plane. */
  168. #else COBRA
  169. #define MONBEG  MONSTART
  170. #endif COBRA
  171.  
  172.  
  173. /*
  174.  * The maps are accessed from supervisor state.
  175.  *
  176.  * The following defines the encodings for the various address spaces used
  177.  * by "movs".
  178.  */
  179.  
  180. #define    SEGMAPADR(addr)    (char *)(((int)addr&MAPADDRMASK))
  181. #define    PAGEMAPADR(addr)(long *)(((int)addr&MAPADDRMASK))
  182.  
  183. #define    IDPROMOFF    0x00000000    /* ID Prom */
  184. #define    CONTEXTOFF    0x30000000    /* Context registers */
  185. #define    ENABLEOFF    0x40000000    /* System Enable Reg -- turns me on */
  186.  
  187. #ifndef COBRA                /* no user DVMA in cobra */
  188. #define    UDMAENABLEOFF    0x50000000    /* User DVMA Enable Reg */
  189. #endif COBRA
  190.  
  191. #define    BUSERROFF    0x60000000    /* Bus Error Register - tells why */
  192. #define    LEDOFF        0x70000000    /* LED's for diagnostics -- 0=lit */
  193. #define    SERIALOFF    0xF0000000    /* Serial port bypass for diagnostics */
  194.  
  195. #define    MAPADDRMASK    0xFFFFE000    /* Keeps bits relevant to map entry */
  196.  
  197.  
  198. /*
  199.  * The following subroutines accept any address in the mappable range.
  200.  * They access the map for the current context.  They assume that we are 
  201.  * currently running in supervisor state.
  202.  *
  203.  * We can't declare getpgmap() as returning a struct, because our C compiler
  204.  * is brain damaged and returns a pointer to a static area if you return a
  205.  * struct.  We therefore return an int and require the caller to set up
  206.  * unions and other assorted random hacks because the language implementation 
  207.  * doesn't support structures returned from reentrant routines.
  208.  */ 
  209.  
  210. extern int            getpgmap();       /* (addr)                             */
  211. extern int            setpgmap();       /* (addr, entry)                      */
  212. extern unsigned short getsegmap();      /* (addr) (unsigned short is returned)*/
  213. extern int            setsegmap();    /* (addr, entry)                      */
  214. extern unsigned char  getsupcontext();    /* () (unsigned char is returned)     */
  215. extern int            setsupcontext();    /* (entry)                            */
  216. extern unsigned char  getusercontext();    /* () (unsigned char is returned)     */
  217. extern int            setusercontext();    /* (entry)                            */
  218.  
  219.